// 最常见的指针类型是引用，引用通过 & 符号表示。
// 不同于其它语言，引用在 Rust 中被赋予了更深层次的含义，那就是：借用其它变量的值。

/*
    该智能指针允许你同时拥有同一个数据的多个所有权，它会跟踪每一个所有者并进行计数，
    当所有的所有者都归还后，该智能指针及指向的数据将自动被清理释放。


    引用和智能指针的另一个不同在于
        前者仅仅是借用了数据，
        后者往往可以拥有它们指向的数据，然后再为其它人提供服务。
*/

/*
智能指针往往是基于结构体实现，它与我们自定义的结构体最大的区别在于它实现了 Deref 和 Drop 特征：

Deref 可以让智能指针像引用那样工作，这样你就可以写出同时支持智能指针和引用的代码，例如 *T
Drop 允许你指定智能指针超出作用域后自动执行的代码，例如做一些数据清除等收尾工作

Box<T>，可以将值分配到堆上
Rc<T>，引用计数类型，允许多所有权存在
Ref<T> 和 RefMut<T>，允许将借用规则检查从编译期移动到运行期进行



*/
